package br.fatec.model.dao;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;

import br.fatec.model.entity.Venda;
import br.fatec.model.entity.Venda.MetodoPagamento;
import br.fatec.util.Globals;
import br.fatec.util.Persistencia;
import br.fatec.util.Validacoes;

public class VendaDao {
private Persistencia persis;		
	
	public VendaDao()
	{
		Globals globals = Globals.getInstance();
		
		this.persis = globals.getPersistencia();
	}
	
	public void cadastrar(Venda venda) throws Exception
	{	
		persis.cadastrar(venda);	
	}
	
	public void alterar(Venda venda) throws Exception
	{	
		persis.alterar(venda);
	}
	
	public void excluir(Venda venda) throws Exception
	{
		persis.excluir(venda.getClass(), venda.getCodigo());
	}
	
	public void desativar(Venda venda) throws Exception {
		venda = consultar(venda.getCodigo());
		
		venda.setAtivo(false);
		
		persis.alterar(venda);
	}
	
	public Venda consultar(Integer codigo) throws Exception
	{	
		String query = "select * from venda where codigo = :codigo and ativo = :ativo"; 
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("codigo", codigo);
		parametros.put("ativo", true);
		
		return (Venda)persis.consultar(Venda.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<Venda> listar() throws Exception
	{
		String query = "select * from venda where ativo = :ativo order by codigo asc"; 
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);
		
		return (List<Venda>)persis.listar(Venda.class, query, parametros);
	}
		
	@SuppressWarnings("unchecked")
	public List<Venda> listar(String nomeCliente) throws Exception {
		String query = "select * from venda"
				+ " inner join cliente on venda.cliente = cliente.codigo"
				+ " where venda.ativo = :ativo and cliente.nome ilike :nome"
				+ " order by venda.codigo asc";

		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nome", "%" +nomeCliente+"%");
		parametros.put("ativo", true);
		
		return (List<Venda>) persis.listar(Venda.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<Venda> filtrar(String codigo, String cliente, String total,
			String dataVenda, MetodoPagamento metodoPagamento) throws Exception {
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);
		
		String query = "select * from venda"
				+ " inner join cliente on venda.cliente = cliente.codigo"
				+ " where venda.ativo = :ativo";

		if (codigo != null && !codigo.isEmpty())
		{
			query += " and cast(venda.codigo as varchar(50)) ilike :codigo";
			parametros.put("codigo", "%" +codigo+"%");
		}

		if (total != null && !total.isEmpty())
		{
			if(Validacoes.isNumeric(total.replace(",", ".")))
			{
				total = new DecimalFormat("0.00").format(Double.parseDouble(total.replace(",", ".")));
			}
			
			query += " and cast(venda.valor_total as varchar(50)) ilike :valor_total";
			parametros.put("valor_total", "%" +total.replace(",", ".")+"%");
		}

		if (metodoPagamento != null)
		{
			query += " and venda.metodo_pagamento = :metodo_pagamento";
			parametros.put("metodo_pagamento", metodoPagamento.ordinal());
		}

		if (dataVenda != null && !dataVenda.isEmpty())
		{
			query += " and to_char(venda.criado_em, 'DD/MM/YYYY') ilike :criado_em";
			parametros.put("criado_em", "%" +dataVenda+"%");
		}

		if (cliente != null && !cliente.isEmpty()) {
			query += " and cliente.nome ilike :cliente";
			parametros.put("cliente", "%" +cliente+"%");
		}
		
		query += " order by venda.codigo asc";

		return (List<Venda>) persis
				.listar(Venda.class, query, parametros);
	}
}
